package com.chase.framerwork.util;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;

import com.chase.framerwork.common.ExpConstants;

/**
 * 字符串工具类
 * 
 * @Author Chase
 * @Date 2013-10-22
 */
public class StringUtil extends StringUtils
{
	/**
	 * 批量追加字符串
	 * 
	 * @param obj
	 *            需要追加的内容
	 * @return 追加后结果
	 */
	public static String appendAll(Object... obj)
	{
		StringBuffer sb = new StringBuffer();
		for (Object var : obj)
		{
			if (var != null)
			{
				sb.append(var);
			}
		}
		return sb.toString().trim();
	}

	/**
	 * 批量追加字符串
	 * 
	 * @param obj
	 *            需要追加的内容
	 * @return 追加后结果
	 */
	public static String builderAll(Object... obj)
	{
		StringBuilder sb = new StringBuilder();
		for (Object var : obj)
		{
			sb.append(var);
		}
		return sb.toString();
	}

	/**
	 * 删除字符串的前缀
	 * 
	 * @param str
	 *            需要删除的字符串
	 * @param prefix
	 *            字符串的前缀
	 * @return 删除后的结构:例如admin删除ad 得到min
	 */
	public static String deletePrefix(String str, String prefix)
	{

		if (!str.startsWith(prefix))
		{
			return null;
		}

		return str.substring(prefix.length());
	}

	/**
	 * 删除字符串的后缀
	 * 
	 * @param str
	 *            需要删除的字符串
	 * @param prefix
	 *            字符串的后缀
	 * @return 删除后的结构:例如admin删除min 得到ad
	 */
	public static String deletePostfix(String str, String postfix)
	{
		if (!str.endsWith(postfix))
		{
			return null;
		}

		return str.substring(0, str.length() - postfix.length());
	}

	/**
	 * 去掉类的包名
	 * 
	 * @param packagePath
	 *            完整类路径
	 * @return 类名
	 */
	public static String removePackage(String packagePath)
	{
		if (!packagePath.contains("."))
		{
			return null;
		}

		return packagePath.substring(packagePath.lastIndexOf(".") + 1);
	}

	/**
	 * 把包名称转换成路径
	 * 
	 * @return
	 */
	public static String convetorPackage2Path(String packagePath)
	{
		if (!packagePath.contains("."))
		{
			return null;
		}

		return packagePath.replaceAll("\\.", "/");
	}

	/**
	 * 批量忽略所有的空白字符串
	 * 
	 * @param str
	 *            需要忽略的字符串
	 * @return List (String)
	 */
	public static List<String> trimAll(String... str)
	{
		List<String> stringList = new ArrayList<String>();
		for (String string : str)
		{
			if (string != null)
			{
				stringList.add(string.trim());
			}
		}
		return stringList;
	}

	/**
	 * 批量判断字符串不为null,""
	 * 
	 * @param str
	 *            需要判断的字符串
	 * @return 只要str中有一个为不满足条件都返回false
	 */
	public static boolean isAllNotEmpty(String... str)
	{
		boolean flag = false;
		for (String string : str)
		{
			if ((string != null) && !("".equals(string.trim())))
			{
				flag = true;
			}
			else
			{
				flag = false;
				break;
			}
		}
		return flag;
	}

	/**
	 * 批量字符串为null,""
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isAllEmpty(String... str)
	{
		return !isAllNotEmpty(str);
	}

	/**
	 * 通过java正则表达式验证字符串
	 * 
	 * @param expression
	 *            java正则表达式
	 * @param value
	 *            需要验证的字符串
	 * @return 验证通过返回true,否则返回false
	 */
	public static boolean validate(String expression, String value)
	{
		if ((null != expression) && (null != value))
		{
			Pattern pattern = Pattern.compile(expression);
			Matcher matcher = pattern.matcher(value);
			return matcher.matches();
		}
		return false;
	}

	/**
	 * 验证用户名是否合法 (5-12位)
	 * 
	 * @param userName
	 *            用户名
	 * @return 验证通过返回true,否则返回false
	 */
	public static boolean isUserName(String userName)
	{
		return validate(ExpConstants.USER_NAME, userName.trim());
	}

	/**
	 * 验证密码是否合法 (5-12位)
	 * 
	 * @param password
	 *            密码
	 * @return 验证通过返回true,否则返回false
	 */
	public static boolean isPassword(String password)
	{
		return validate(ExpConstants.PASSWORD, password.trim());
	}

	/**
	 * 验证qq号码是否合法
	 * 
	 * @param qq
	 *            QQ号
	 * @return 验证通过返回true,否则返回false
	 */
	public static boolean isQQ(String qq)
	{
		return validate(ExpConstants.QQ, qq.trim());
	}

	/**
	 * 验证email号码是否合法
	 * 
	 * @param email
	 *            电子邮件
	 * @return 验证通过返回true,否则返回false
	 */
	public static boolean isEmail(String email)
	{
		return validate(ExpConstants.E_MAIL, email.trim());
	}

	/**
	 * 验证ip地址是否合法
	 * 
	 * @param ip
	 *            IP地址
	 * @return 验证通过返回true,否则返回false
	 */
	public static boolean isIP(String ip)
	{
		return validate(ExpConstants.IP, ip.trim());
	}

	/**
	 * 验证url地址是否合法
	 * 
	 * @param url
	 *            URL地址
	 * @return 验证通过返回true,否则返回false
	 */
	public static boolean isURL(String url)
	{
		return validate(ExpConstants.URL, url.trim());
	}

	public static boolean isHTML(String html)
	{
		return validate(ExpConstants.HTML, html.trim());
	}

	/**
	 * 验证邮政编码地址是否合法
	 * 
	 * @param post
	 *            邮政编码
	 * @return 验证通过返回true,否则返回false
	 */
	public static boolean isPOST(String post)
	{
		return validate(ExpConstants.POST, post.trim());
	}

	/**
	 * 验证身份证是否合法
	 * 
	 * @param id
	 *            身份证
	 * @return 验证通过返回true,否则返回false
	 */
	public static boolean isIdCard(String id)
	{
		return validate(ExpConstants.ID_CARD, id.trim());
	}

	/**
	 * 验证是否为中文字符
	 * 
	 * @param China
	 *            中文字符
	 * @return 验证通过返回true,否则返回false
	 */
	public static boolean isChina(String China)
	{
		return validate(ExpConstants.CHINA, China.trim());
	}

	/**
	 * 验证是否为图片格式(*.jpg,*.gif,*.png,*.bmp)
	 * 
	 * @param image
	 *            图片名
	 * @return 验证通过返回true,否则返回false
	 */
	public static boolean isImage(String image)
	{
		return validate(ExpConstants.IMAGE, image.trim());
	}

	/**
	 * 验证是否为音乐格式
	 * 
	 * @param music
	 * @return
	 */
	public static boolean isMusic(String music)
	{
		return validate(ExpConstants.MUSIC, music.trim());
	}

	/**
	 * 验证价格是否合法
	 * 
	 * @param price
	 *            价格
	 * @return 验证通过返回true,否则返回false
	 */
	public static boolean isPrice(String price)
	{
		return validate(ExpConstants.PRICE, price.trim());
	}

	/**
	 * 验证电话号码是否合法
	 * 
	 * @param tel
	 *            电话号码
	 * @return 验证通过返回true,否则返回false
	 */
	public static boolean isTel(String tel)
	{
		return validate(ExpConstants.PRICE, tel.trim());
	}

	/**
	 * 判断Object是否为一个String字符串
	 * 
	 * @param obj
	 *            对象
	 * @return 对象为String返回true,否则返回false
	 */
	public static boolean isString(Object obj)
	{
		return (obj != null) && (obj instanceof String);
	}
    
    /**
     * 把空对象转换成空字符串
	 * @param obj
	 * @return
	 */
	public static String null2Empty(Object obj) 
	{
		if(obj != null)
		{
			return String.valueOf(obj);
		}
		return "";
	}
}